package br.com.vti.sisp_sicrim.antigo.model;

import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;

import br.com.vti.sisp_sicrim.antigo.dao.SicEstatisticaDAO;
import br.com.vti.sisp_sicrim.antigo.util.ExceptionProgram;

@SuppressWarnings("serial")
public class SicEstatistica implements Serializable {

	private String id = "";
	private String codigoModelo = "";
	private Integer codigoTipo = 0;
	private Integer dataAtualiz = 0;
	private Integer olddataAtualiz = 0; // ctrl quebra
	private Integer matriculaFunc = 0;
	private Integer numeroSeq = 0;
	private Integer horaem = 0;
	private Integer numeroPosto = 0;
	private String ufeder = "";
	private Long numeroRg = 0L;
	private String nomeId = "";
	// private int maxquantTrans = 0;
	private Long[] quantTrans = new Long[200];
	private ResultSet consulta = null;
	private ResultSet consultaQuantTrans = null;
	private SicEstatisticaDAO sicEstatisticaDAO = new SicEstatisticaDAO();

	public SicEstatistica() {
		super();
	}

	public SicEstatistica(String id, String codigoModelo, Integer codigoTipo, Integer dataAtualiz, Integer matriculaFunc, Integer numeroSeq, Integer horaem, Integer numeroPosto, String ufeder, Long numeroRg, String nomeId) {
		super();
		this.id = id;
		this.codigoModelo = codigoModelo;
		this.codigoTipo = codigoTipo;
		this.dataAtualiz = dataAtualiz;
		this.matriculaFunc = matriculaFunc;
		this.numeroSeq = numeroSeq;
		this.horaem = horaem;
		this.numeroPosto = numeroPosto;
		this.ufeder = ufeder;
		this.numeroRg = numeroRg;
		this.nomeId = nomeId;
	}

	public void grava() {

		try {
			this.id = sicEstatisticaDAO.insert(codigoModelo, codigoTipo, dataAtualiz, matriculaFunc, numeroSeq, horaem, numeroPosto, ufeder, numeroRg, nomeId);
			gravaQuantTrans();
		} catch (Exception e) {
			throw new ExceptionProgram(e, null, "");
		}
	}

	public void gravaQuantTrans() {
		for (int seq = 1; seq <= 199; seq++) {
			if (this.quantTrans[seq] == null) {
				continue;
			}
			sicEstatisticaDAO.insertQuantTrans(this.id, seq, this.quantTrans[seq]);
		}

	}

	public void atualiza() {

		try {
			sicEstatisticaDAO.update(this.id, codigoModelo, codigoTipo, dataAtualiz, matriculaFunc, numeroSeq, horaem, numeroPosto, ufeder, numeroRg, nomeId);
			atualizaQuantTrans();
		} catch (Exception e) {
			throw new ExceptionProgram(e, null, "");
		}
	}

	public void atualizaQuantTrans() {
		for (int seq = 1; seq <= 199; seq++) {
			final Long qtdTrans = this.quantTrans[seq];
			if (qtdTrans != null) {
				sicEstatisticaDAO.updateQuantTrans(this.id, seq, qtdTrans);
			}
		}

	}

	public boolean pesquisaMotidaFaixa(String pCodigoModelo, Integer pCodigoTipo, Integer pMatriculaFunc, Integer pDataAtualizIni, Integer pDataAtualizFim) {

		try {
			if (consulta == null) {
				consulta = sicEstatisticaDAO.findMotidain(pCodigoModelo, pCodigoTipo, pMatriculaFunc, pDataAtualizIni, pDataAtualizFim);
			} else {
				consulta = sicEstatisticaDAO.pesquisaProximo();
			}
			if (consulta == null) {
				fecha();
				return false;
			}
			formataAtributos(consulta);
		} catch (Exception e) {
			throw new ExceptionProgram(e, null, "");
		}
		return true;
	}

	public boolean leituraMotida() {

		try {
			if (consulta == null) {
				consulta = sicEstatisticaDAO.readMotida();
			} else {
				consulta = sicEstatisticaDAO.pesquisaProximo();
			}
			if (consulta == null) {
				fecha();
				return false;
			}
			formataAtributos(consulta);
		} catch (Exception e) {
			throw new ExceptionProgram(e, null, "");
		}
		return true;
	}

	public boolean consultaMotida(String pCodigoModelo, Integer pCodigoTipo, Integer pDataAtualiz, Integer pMatriculaFunc) {

		try {
			if (consulta == null) {
				consulta = sicEstatisticaDAO.selectMotida(pCodigoModelo, pCodigoTipo, pDataAtualiz, pMatriculaFunc);
			} else {
				consulta = sicEstatisticaDAO.pesquisaProximo();
			}
			if (consulta == null) {
				fecha();
				return false;
			}
			formataAtributos(consulta);
		} catch (Exception e) {
			throw new ExceptionProgram(e, null, "");
		}
		return true;
	}

	public boolean fimDados() {
		return !(sicEstatisticaDAO.temProximo());
	}

	public void salvarQuebras() {

		olddataAtualiz = dataAtualiz;
	}

	public void formataAtributos(ResultSet lista) {

		if (lista == null)
			return;
		salvarQuebras();
		try {
			this.id = lista.getString("id");
			this.codigoModelo = lista.getString("codigoModelo");
			this.codigoTipo = lista.getInt("codigoTipo");
			this.dataAtualiz = lista.getInt("dataAtualiz");
			this.matriculaFunc = lista.getInt("matriculaFunc");
			this.numeroSeq = lista.getInt("numeroSeq");
			this.horaem = lista.getInt("horaem");
			this.numeroPosto = lista.getInt("numeroPosto");
			this.ufeder = lista.getString("ufeder");
			this.numeroRg = lista.getLong("numeroRg");
			this.nomeId = lista.getString("nomeId");
			formataQuantTrans(this.id);
		} catch (SQLException e) {
		}
	}

	public void formataQuantTrans(String id) {
		int seq;
		consultaQuantTrans = sicEstatisticaDAO.pesquisaQuantTrans(id);
		while (consultaQuantTrans != null) {
			try {
				seq = consultaQuantTrans.getInt("seq");
				this.quantTrans[seq] = consultaQuantTrans.getLong("quantTrans");
				consultaQuantTrans = sicEstatisticaDAO.proximoQuantTrans();
			} catch (SQLException e) {
			}
		}

	}

	public boolean quebraDinestdatatu() {

		return olddataAtualiz != dataAtualiz;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getCodigoModelo() {
		return codigoModelo;
	}

	public void setCodigoModelo(String codigoModelo) {
		this.codigoModelo = codigoModelo;
	}

	public Integer getCodigoTipo() {
		return codigoTipo;
	}

	public void setCodigoTipo(Integer codigoTipo) {
		this.codigoTipo = codigoTipo;
	}

	public Integer getDataAtualiz() {
		return dataAtualiz;
	}

	public void setDataAtualiz(Integer dataAtualiz) {
		this.dataAtualiz = dataAtualiz;
	}

	public Integer getMatriculaFunc() {
		return matriculaFunc;
	}

	public void setMatriculaFunc(Integer matriculaFunc) {
		this.matriculaFunc = matriculaFunc;
	}

	public Integer getNumeroSeq() {
		return numeroSeq;
	}

	public void setNumeroSeq(Integer numeroSeq) {
		this.numeroSeq = numeroSeq;
	}

	public Integer getHoraem() {
		return horaem;
	}

	public void setHoraem(Integer horaem) {
		this.horaem = horaem;
	}

	public Integer getNumeroPosto() {
		return numeroPosto;
	}

	public void setNumeroPosto(Integer numeroPosto) {
		this.numeroPosto = numeroPosto;
	}

	public String getUfeder() {
		return ufeder;
	}

	public void setUfeder(String ufeder) {
		this.ufeder = ufeder;
	}

	public Long getNumeroRg() {
		return numeroRg;
	}

	public void setNumeroRg(Long numeroRg) {
		this.numeroRg = numeroRg;
	}

	public String getNomeId() {
		return nomeId;
	}

	public void setNomeId(String nomeId) {
		this.nomeId = nomeId;
	}

	public Long[] getQuantTrans() {
		return quantTrans;
	}

	public void setQuantTrans(Long[] quantTrans) {
		this.quantTrans = quantTrans;
	}

	public long getQuantTrans(int index) {
		Long aux = quantTrans[index];
		return (aux != null ? quantTrans[index] : 0);
	}

	public void setQuantTrans(int index, long quantTrans) {
		this.quantTrans[index] = quantTrans;
	}

	public void fecha() {
		sicEstatisticaDAO.fecha();
		consulta = null;
	}

	public long registrosProcessados() {
		return sicEstatisticaDAO.nroRegistro;
	}

	public long totalRegistros() {
		return sicEstatisticaDAO.qtdRegistros;
	}

}
